package com.demo.shareJDBC.controller;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.demo.shareJDBC.domain.User;
import com.demo.shareJDBC.mapper.UserMapper;
import com.demo.shareJDBC.util.IdGeneratorUtil;
import io.swagger.annotations.ApiOperation;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;
import java.util.List;

/**
 * @Author likz
 * @Date 2025/4/22 17:49
 * @Description
 **/
@RestController
@RequestMapping("/test")
public class TestController {

    @Resource
    UserMapper userMapper;
    @Resource
    IdGeneratorUtil idGeneratorUtil;




    @GetMapping("/insertTest")
    @ApiOperation(value = "插入测试数据")
    public void insertTest(){
        for (int i = 1 ; i < 100; i++) {
            User test = new User();
            test.setCid(idGeneratorUtil.snowflakeId());
            test.setName("test"+i);
            test.setGender("男"+i);
            test.setData("test"+i);
            test.setUserId(Long.valueOf(i));
            userMapper.insert(test);
        }
    }
    /**
     * 针对分片键进行精确查询，都可以使用表达式控制
     * 对于in查询，4.x遇到混合分片结果，会直接走全分片路由。 新版本会进行精确分片
     * select * from course where cid=xxx
     */
    @GetMapping("/queryUser")
    @ApiOperation(value = "inline 精确")
    public void queryUser() {
        QueryWrapper<User> wrapper = new QueryWrapper<>();
        //wrapper.eq("user_id",1);
        wrapper.in("user_id",2,5,46,83);
        //带上排序条件不影响分片逻辑
//        wrapper.orderByDesc("user_id");
        List<User> courses = userMapper.selectList(wrapper);
        courses.forEach(course -> System.out.println(course));
    }
    /**
     * 针对分片键进行范围查询。  （BETWEEN AND、>、<、>=、<=
     * 使用表达式控制时，无法直接支持范围查询。
     * 需要将参数allow-range-query-with-inline-sharding 设定为true(默认是false)，
     * 但此时，SQL执行将改为查询每一个数据分片。
     * ShardingJDBC新版本在实现时，是在每个库里以UNION的方式查询每个表。减少了SQL语句的数量。实际上对于所有全分片路由，都采用了这种优化方式。
     */
    @GetMapping("/queryUserRange")
    @ApiOperation(value = "范围查询")
    public void queryUserRange() {
        QueryWrapper<User> wrapper = new QueryWrapper<>();
        wrapper.between("user_id",2,30);
        List<User> courses = userMapper.selectList(wrapper);
        courses.forEach(course -> System.out.println(course));
    }





}
